package com.tinfeng.uplevel;

public class JavaStringClass {
    // String类
    public static void main(String[] args) {
        String str1 = "hello world";
        int a = str1.length();
        System.out.println(a);

        // char charAt(int index)获取指定位置字符串
        char b =str1.charAt(6);
        System.out.println(b);

        // 获取字符串出现的第一次的位置
        int c = str1.indexOf("w");
        System.out.println(c);

        // 获取字符串出现的最后的位置
        int d = str1.lastIndexOf("o");
        System.out.println(d);
        // 没找到则返回-1

        //字符串截取
        // String substring(int beginIndex) 获取从beginIndex位置开始到结束的子串
        // String substring(int beginIndex, int endIndex) 获取从beginIndex位置开始到endIndex位置的字符串(不包含endIndex位置字符)
        String e = str1.substring(5);
        String f = str1.substring(5,7);
        System.out.println(e);
        System.out.println(f);

        // 字符串切割
        // 切割为字符串数组
        // String[] split(String regex)方法可将字符串切割为子串，其参数regex是一个正则表达式分隔符，返回字符串数组
        // 切割完后要用foreach遍历出来
        String str2 = "I love you";
        String[] strarr = str2.split(" ",2); // 加了限制
        for (String str:strarr
             ) {
            System.out.print(str+"\t");
        }

        //几种特殊的分隔符：* ^ : | . \，要使用转义字符转义
        String str3 = "I*love*Java";
        String[] strArr2 = str2.split("\\*");

// 以\切割
        String str4 = "I\\love\\Java";
        String[] strArr3 = str4.split("\\\\");

// 以|切割
        String str5 = "I|love|Java";
        String[] strArr4 = str4.split("\\|");

        // 另外，还有一个重载方法 String[] split(String regex, int limit)，其第二个参数 limit 用以控制正则匹配被应用的次数，因此会影响结果的长度


        // 切割为 byte 数组
        // 可以使用 getBytes() 方法将字符串转换为 byte 数组
        byte[] bytes = str1.getBytes();
        for (byte abyte:bytes
             ) {
            System.out.print(abyte+"\t");
        }

        // 再把数组转为字符串，只需再new一个实例化字符串对象
        String s = new String(bytes);
        System.out.println(s);

        // 字符串大小写转换
        String l = str1.toUpperCase(); // 大写
        System.out.println(l);

        String v = l.toLowerCase(); // 小写
        System.out.println(v);


        // 大小写相互转换， 利用split切割为两个数组,分别转换
        String r = "HELLO world";
        String[] s1 = r.split(" ");
        System.out.println(s1[0].toLowerCase() +" " + s1[1].toUpperCase());

        // 字符串比较
        // 字符串比较必须要用equals()去比较是否相同，并会返回一个布尔值
        // 执行String str1 = "hello" 会在内存的栈空间创建一个str1，并在常量池中建一个hello，str1指向hello
        // 执行String str2 = "hello" 时 会和str1同理 他俩之间比较用==也可以返回true 因为指向了同一个常量池，地址相同

        // 但当String str3 = new String("hello") 时，实例化对象是在堆中执行的，地址变了 就算值相同，用==也会返回flase，用equals()则不会

    }
}
